<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello World</h1>
<script>
    var name = 'window'

    function Person(name) {
        this.name = name
        this.obj = {
            name: 'obj',
            foo1: function () {
                return function () {
                    console.log(this.name)
                }
            },
            foo2: function () {
                return () => {
                    console.log(this.name)
                }
            }
        }
    }

    var person1 = new Person('person1')
    var person2 = new Person('person2')

    person1.obj.foo1()()                            // window   function声明的函数，当前对象this默认为window
    person1.obj.foo1.call(person2)()                // window   function声明的函数，当前对象this默认为window
    person1.obj.foo1().call(person2)                // person2  function声明的函数，当前对象this默认为window，此时修改function函数当前对象this为person2

    person1.obj.foo2()()                            // obj      箭头函数，是个闭包。声明箭头函数的时候，所在上下文对象变量中，this为foo2的当前对象，也就是obj
    person1.obj.foo2.call(person2)()                // person2  箭头函数，是个闭包。声明箭头函数的时候，所在上下文对象变量中，this为foo2的当前对象，此时已经替换为person2
    person1.obj.foo2().call(person2)                // obj      箭头函数，是个闭包，修改闭包函数的当前对象this无效。

</script>
</body>
</html>